package com.example.desionMode.cart;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author houyangfan
 * @version 1.0
 * @date 2022/8/4 11:50
 * 普通用户需要收取运费，运费是商品价格的 10%，无商品折扣；
 *
 * VIP 用户同样需要收取商品价格 10% 的快递费，但购买两件以上相同商品时，第三件开始享受一定折扣；
 *
 * 内部用户可以免运费，无商品折扣。
 *
 * 该类中用于实现三种用户类型通用的添加购物车的逻辑
 */
public abstract class CommonCart {

    public Cart process(Integer uid, Map<Integer, Integer> map){

        Cart cart = new Cart();
        List<Item> items = new ArrayList<>();

        map.entrySet().forEach(entry->{
            Item item = new Item();
            item.setQuantity(entry.getValue());
            item.setId(entry.getKey());
            item.setPrice(new BigDecimal("10"));
            items.add(item);
        });
        cart.setItems(items);
        items.forEach(item -> {
            processCouponPrice(uid, item);
            processDeliveryPrice(uid, item);
        });

        // 总价格
        cart.setTotalItemPrice(items.stream().map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))).reduce(BigDecimal.ZERO, BigDecimal::add));
        // 总运费
        cart.setTotalDeliveryPrice(items.stream().map(Item::getDeliveryPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
        // 总折扣
        cart.setTotalDiscount(items.stream().map(Item::getCouponPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
        // 总的实际支付 = 总价格+总运费-总折扣
        cart.setPayPrice(cart.getTotalItemPrice().add(cart.getTotalDeliveryPrice()).subtract(cart.getTotalDiscount()));

        return cart;
    }

    public abstract void processCouponPrice(Integer uid, Item item);

    public abstract void processDeliveryPrice(Integer uid, Item item);

}
